#include <unistd.h>
#include <assert.h>

//#define USE_PTRACE 

#include "backtracer.h"
#include "backtracer_linux.h"
#include "backtracer_linux_arm.h"
#include "log.h"
#include "debug.h"
#include "map_utils.h"
#include "map_utils_linux.h"
#include "map_utils_linux_elf.h"
#include "linux_elf_utils.h"
#include "linux_ptrace_utils.h"
#include "memory_utils.h"
#include "arm_utils.h"
#include "linux_arm_exidx_elf.h"
#include "backtracer_arm_exidx.h"

void _Map_Dump(func_map *pmap);

int fail(int x)
{
    int a = 0, b = *(int*)-1;
    puts((char*) -1);
    
    return a + b;
}

void f2(int x, int y);

void f1()
{
    char a = 0, b = 0;
    f2(a, b);
}

void f2(int x, int y)
{
    y = fail(100);
    printf("%d", y);
}


int main(int argc, char** argv)
{
//    assert(argc == 2);
//    ptrace_session *session = NULL;
//    PtraceOpen(atoi(argv[1]), session);
//    PtraceGetSetSession(session);

    InitLog(stdout);
    func_map map  = {};
//    func_map map1 = {};
//    func_map map2 = {};
//    _ScanMapFile(&map1, "map.out");
//    assert(argc == 2);
    ElfGetDynamicFuncMap(&map);
//    MergeFuncMaps(&map1, &map2, &map);
 
    SortFuncMap(&map);
    _Map_Dump(&map);
    SetSigSegvHandling(&map);


//    addr_t regs[ARM_REGISTER_COUNT] = {0};
//    GetRegisters(regs);
//    for(i = 0; i < ARM_REGISTER_COUNT; ++i)
//        printf("\nr[%d] is [%x]", i, regs[i]);

//    printf("\n");

//    DefaultBacktraceExidx(&map, (void*)regs[11], (void*)regs[15]);

//    free(map1.map_);
//    free(map2.map_);
    free(map.map_);

//    PtraceClose(session);

    return 0;
}
